package com.my.assembly.handler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.RecognizerListener;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechRecognizer;
import com.my.assembly.bridge.BridgeHandler;
import com.my.assembly.bridge.BridgeWebView;
import com.my.assembly.bridge.CallBackFunction;
import com.my.assembly.utils.HandlerUtils;

/**
 * <pre>
 *     author : wxq
 *     time   : 2019/01/09
 *     desc   :
 *     version: 1.0
 * </pre>
 */
public class XfunVoiceHandler implements BridgeHandler {

    private Activity mContext;
    private SpeechRecognizer mIat;
    private BridgeWebView mWebView;
    private boolean resultFlag = false;

    private String result = "";

    public XfunVoiceHandler(Activity context, BridgeWebView webView) {
        this.mContext = context;
        this.mWebView = webView;
        initRecognizer();
    }

    private void initRecognizer() {
        //初始化识别无UI识别对象
        //使用SpeechRecognizer对象，可根据回调消息自定义界面；
        mIat = SpeechRecognizer.createRecognizer(mContext, new InitListener() {
            @Override
            public void onInit(int i) {
            }
        });

        if (mIat != null) {
            //设置语法ID和 SUBJECT 为空，以免因之前有语法调用而设置了此参数；或直接清空所有参数，具体可参考 DEMO 的示例。
            mIat.setParameter(SpeechConstant.CLOUD_GRAMMAR, null);
            mIat.setParameter(SpeechConstant.SUBJECT, null);
            //设置返回结果格式，目前支持json,xml以及plain 三种格式，其中plain为纯听写文本内容
            mIat.setParameter(SpeechConstant.RESULT_TYPE, "plain");
            //此处engineType为“cloud”
            mIat.setParameter(SpeechConstant.ENGINE_TYPE, "cloud");
            //设置语音输入语言，zh_cn为简体中文
            mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
            //设置结果返回语言
            mIat.setParameter(SpeechConstant.ACCENT, "mandarin");
            // 设置语音前端点:静音超时时间，单位ms，即用户多长时间不说话则当做超时处理
            //取值范围{1000～10000}
            mIat.setParameter(SpeechConstant.VAD_BOS, "2000");
            //设置语音后端点:后端点静音检测时间，单位ms，即用户停止说话多长时间内即认为不再输入，
            //自动停止录音，范围{0~10000}
            mIat.setParameter(SpeechConstant.VAD_EOS, "10000");
            //设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
            mIat.setParameter(SpeechConstant.ASR_PTT, "0");
        }
    }

    @Override
    public void handler(String data, CallBackFunction function) {
        JsonObject jsonObject = (JsonObject) new JsonParser().parse(data);
        String type = jsonObject.get("type").getAsString();
        if (mIat == null) return;
        if ("start".equals(type)) {
            //开始识别
            result = "";
            resultFlag = false;
            mIat.stopListening();
            mIat.startListening(new RecognizerListener() {
                @Override
                public void onVolumeChanged(int i, byte[] bytes) {

                }

                @Override
                public void onBeginOfSpeech() {

                }

                @Override
                public void onEndOfSpeech() {

                }

                @Override
                public void onResult(final RecognizerResult recognizerResult, boolean b) {
//                    if (!resultFlag) {
//                        resultFlag = true;
//                        mIat.stopListening();
                    result += recognizerResult.getResultString();
//                    }
                }

                @Override
                public void onError(final SpeechError speechError) {
//                    HandlerUtils.post(new Runnable() {
//                        @Override
//                        public void run() {
//                            mWebView.callHandler("recognition", speechError.getErrorDescription()
//                                    + speechError.getErrorCode(), new CallBackFunction() {
//                                @Override
//                                public void onCallBack(String data) {
//
//                                }
//                            });
//                        }
//                    });
                }

                @Override
                public void onEvent(int i, int i1, int i2, Bundle bundle) {

                }
            });
        } else {
            //结束识别
            new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                @Override
                public void run() {
                    mIat.stopListening();
                    HandlerUtils.post(new Runnable() {
                        @Override
                        public void run() {
                            mWebView.callHandler("recognition", result, new CallBackFunction() {
                                @Override
                                public void onCallBack(String data) {

                                }
                            });
                        }
                    });
                }
            }, 2000);
        }
    }
}
